package com.sunni.service.impl;

import com.sunni.dao_old.RoleDao;
import com.sunni.dao_old.UserDao;
import com.sunni.entity.Role;
import com.sunni.entity.User;
import com.sunni.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

@Component("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    @Autowired
    @Qualifier("roleDao")
    private RoleDao roleDao;

    @Override
    public List<User> selectAll() {
        // 1. 先 查出所有user
        List<User> userList = userDao.selectAll();

        // 2. 再 根据每个用户(user)的id, 查出对应的所有角色(roleList)
        for (User user : userList) {
            // 2.1. roleList：查出所有的role 根据userId
            List<Role> roleList = roleDao.selectByUserId(user.getId());
            // 2.2. user添加上应的角色集合
            user.setRoleList(roleList);
        }

        return userList;
    }

    /**
     * day06-16、17 : 用户添加2、3  先添加user从表数据，再添加user_role主表user_role关联的数据
     * @param user 用户信息
     * @param roleIds 角色选择框
     */
    @Override
    public void add(User user, Long[] roleIds) {
         // 1.添加user   2.返回user的id
        Long userId = userDao.addUser(user);

        // 3. 遍历添加 userId、roleId[] 关系
        for (Long roleId : roleIds) {
            userDao.addUserRole(userId,roleId);
        }
    }

    /**
     * 删除用户 : 1.删除主表sys_user_role关系 2.删除从表sys_user信息
     * @param userId 要删除的userId
     * @return 重新查询操作
     */
    @Override
    public void deleteByUserId(Long userId) {
        // 1. 删除主表 sys_user_role的关系
        userDao.deleteUserRoleByUserId(userId);

        // 2. 删除从表 sys_user的user信息
        userDao.deleteUserByUserId(userId);
    }

    /**
     * day07-08 验证账号密码是否正确? 正确 把user放到session
     * @param user 封装了login.jsp的username和password
     * @param request service层 获取session作用域存储user
     * @return 要跳转到的页面
     */
    @Override
    public String loginCheck(User user, HttpServletRequest request) {

        /*day07-09 : queryForObject查询为null ，不返回null， 抛异常EmptyResultDataAccessException*/
        User userResult = null;
        try {
            userResult = userDao.loginCheck(user);
        } catch (EmptyResultDataAccessException e){
            userResult = null;
        }

        /*day07-08 : 验证账号密码是否正确?(用这个username and password 查出来的user是不是空的) 正确 把user放到session*/
        if (userResult == null){  //没查出来(查出来为null，说明没查出来)
            return "redirect:/login.jsp";
        }else {
            HttpSession session = request.getSession();
            session.setAttribute("user",user);
            return "redirect:/index.jsp";
        }
    }
}
